package tosutils

import (
	"bytes"
	"encoding/json"
	"fmt"
	"gitlab.local/golibrary/apputils"
	"gitlab.local/golibrary/linux"
	"gitlab.local/golibrary/user"
	"gitlab.local/golibrary/utils"
	"os"
	"path/filepath"
	"strings"
	"syscall"
)

type ExtendApp struct {
	Icon              string      `json:"icon"`              // 窗口图标
	ID                string      `json:"id"`                // 窗口唯一id
	Path              string      `json:"path"`              // 兼容旧式页面，设置即用iframe加载相应path
	Name              interface{} `json:"name"`              // 窗口标题："meto", "menu_Control"
	MaxMin            bool        `json:"maxmin"`            // 是否显示放大缩小
	Width             int         `json:"width,omitempty"`   // 窗体宽度
	Height            int         `json:"height,omitempty"`  // 窗体高度
	Exec              bool        `json:"exec"`              // 控制是否需要启动
	OpenPath          bool        `json:"open_path"`         // 控制是否新窗口打开
	Resize            bool        `json:"resize"`            // 是否可改变大小
	State             bool        `json:"state"`             // 默认是否打开
	Reset             bool        `json:"reset"`             // 是否需要重置功能
	Type              string      `json:"type"`              // 窗口类型：Control:没有侧边栏, tab:有左右边, iframe:兼容老版本
	Help              string      `json:"help"`              // 是否有帮助
	Depend            []string    `json:"depend"`            // 是否有依赖
	IsDelete          bool        `json:"is_delete"`         // 是否可删除
	RealFile          string      `json:"-"`                 // 程序内部使用 应用快捷方式的真实路径
	DesktopShow       bool        `json:"desktopShow"`       // 是否桌面展示
	NavigationBarShow bool        `json:"navigationBarShow"` // 是否导航栏展示展示
	TypesOf           string      `json:"typesOf"`           // 种类

}

func GetHomeDir() string {
	mainVol := linux.GetMainVolume()
	if mainVol != "" {
		return filepath.Join(mainVol, "User")
	}
	return ""
}

func GetUserHomeDir(name string) string {
	home := GetHomeDir()
	if home != "" {
		return filepath.Join(home, name)
	}
	return ""
}

func LoadDesktopApps(lang string) (result []*ExtendApp) {
	result = make([]*ExtendApp, 0)
	list, err := filepath.Glob("/Volume*/@desktop/" + fmt.Sprintf("*.%s.oexe", lang))
	if err != nil {
		return
	}
	for _, file := range list {
		b, err := os.ReadFile(file)
		if err != nil {
			_ = os.Remove(file)
			continue
		}
		b = bytes.ReplaceAll(b, []byte("\n"), []byte(""))
		b = bytes.ReplaceAll(b, []byte("\t"), []byte(""))
		info := ExtendApp{}
		info.RealFile = file
		err = json.Unmarshal(b, &info)
		if err == nil {
			if info.Type == "" {
				info.Type = "iframe"
			}
			info.Resize = true
			info.IsDelete = true
			info.Help = ReWriteLanguage(lang, info.Help)
			if app := apputils.CheckAppState(info.ID); app != nil {
				info.Path = app.Path
				result = append(result, &info)
			}
		} else {
			fmt.Println(err)
		}
	}
	return
}

func ReWriteLanguage(lang, s string) string {
	if s != "" && strings.Contains(s, "%s") {
		s = fmt.Sprintf(s, lang)
	}
	return s
}

// InitUserHome 初始化用户home目录
func InitUserHome(username string) {
	u, err := user.Lookup(username)
	if err != nil {
		return
	}
	//userHomeDir := GetUserHomeDir(u.Username)
	if u.HomeDir == "" {
		return
	}
	_ = utils.SwitchUserRight()
	_ = os.MkdirAll(u.HomeDir, os.ModePerm)
	fileInfo, err := os.Stat(u.HomeDir)
	if err != nil {
		return
	}
	stat, ok := fileInfo.Sys().(*syscall.Stat_t)
	if !ok {
		return
	}
	if fmt.Sprintf("%d", stat.Uid) != u.Uid {
		_, _ = utils.ShellExec(fmt.Sprintf("chown '%s:admin' '%s'", u.Name, u.HomeDir))
		// 后台change user home dir ownerGroup
		go utils.ShellExec(fmt.Sprintf("chown -R '%s:admin' '%s'", u.Name, u.HomeDir))
	}
}
